home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / lib / phase.asm < prev    next >
Assembly Source File  |  1994-06-01  |  10KB  |  431 lines

  1. ;    PCM SOUND PHASE SHIFT DELAY
  2. ;
  3. ;
  4. ;        Hiroshi TODA
  5. ;
  6. ;        1995 1 High C 用
  7. ;
  8. ;    phaseDelay( sourceSNDdata, distnationSNDdata, para, work ) ;
  9. ;    para:maindelay,phasedelay,mix1,mix2,md1,sp1,ang1,nd2,sp2,ang2
  10. ;    work:512Byte work area
  11.  
  12.  
  13.     .386p
  14.  
  15.  
  16. param    struc
  17.  
  18.     dd    ?
  19.     dd    ?
  20. source    dd    ?        ; source snd.data address
  21. new        dd    ?        ; new snd.data address
  22. paradd    dd    ?        ; para. address
  23. wadd    dd    ?         ; work address
  24.  
  25. param   ends
  26.  
  27.  
  28. work    struc
  29.  
  30. ;data area
  31.  
  32. delay1    dd    ?        ; main delay Byte
  33. delay2    dd    ?        ; phase delay Byte
  34. mix1    dd    ?        ; main mix rate
  35. mix2    dd    ?        ; vibrato mix rate
  36. md1    dd    ?        ; modulation1
  37. sp1    dd    ?        ; speed1 (90 = 10000H)
  38. ang1    dd    ?        ; angle1
  39. md2    dd    ?        ; modulation2
  40. sp2    dd    ?        ; speed2 (90 = 10000H)
  41. ang2    dd    ?        ; angle2
  42.  
  43. point0    dd    ?        ; 10000H-point1
  44. point1    dd    ?        ; ov.sampling point (decimal)
  45. point2    dd    ?        ; ov.sampling point (integer)
  46. buf1    dd    ?        ; sampling add buf.
  47.  
  48. ;    これ以下 1995 1 に追加
  49. sourceStart    dd    ?        ; source data の 開始アドレス
  50. sourceEnd    dd    ?        ; source data の 終了アドレス
  51. dly        dd    ?        ; delay1 - delay2
  52.  
  53. work    ends
  54.  
  55.  
  56. cseg    segment    dword public use32 'CODE'
  57.     assume    cs:cseg,ds:cseg
  58.  
  59.     public    sndPhaseDelay
  60.     db    'sndPhaseDelay',13
  61. sndPhaseDelay    proc    near
  62.     push    ebp
  63.     mov        ebp,esp
  64.     push    esi
  65.     push    edi
  66.     push    ebx
  67.  
  68.     mov    esi,[ebp].wadd        ; esi <-- work area top add
  69.     mov    edi,[ebp].source    ; edi <-- source data add.
  70.     mov    ebx,[ebp].new        ; ebx <-- new data add.
  71.     mov    ecx,[ebp].paradd    ; ecx <-- para. add.
  72.     xor    edx,edx            ; edx=count
  73. main00:
  74.     mov    eax,[ecx][edx*4]    ; para. --> work area
  75.     mov    [esi][edx*4],eax
  76.     inc    edx
  77.     cmp    edx,10
  78.     jb    main00
  79.  
  80.     mov    eax,[esi].delay1    ; dly = delay1 - delay2
  81.     sub    eax,[esi].delay2
  82.     mov    [esi].dly,eax
  83.  
  84.     mov    edx,edi
  85.     add    edx,32
  86.     mov    [esi].sourceStart,edx    ; sourceStart = source start address
  87.     add    edx,[edi+12]
  88.     mov    [esi].sourceEnd,edx        ; sourceEnd = source end address
  89.  
  90.     mov    ecx,[edi+12]        ; length
  91.     cmp    ecx,0
  92.     jbe    mainE                ; jb を jbe に変更 1993 12
  93.  
  94.     xor    edx,edx                ; snd head trans
  95. main01:
  96.     mov    eax,[edi][edx*4]
  97.     mov    [ebx][edx*4],eax
  98.     inc    edx
  99.     cmp    edx,8
  100.     jb    main01
  101.  
  102.     add    ebx,32
  103.     add    edi,32
  104.     add    edi,[esi].delay2    ; ediはphaseに合わせる
  105.  
  106. main02:
  107.     mov    [esi].point2,edi    ; ov.sampling point cal.
  108.     xor    eax,eax
  109.     mov    [esi].point1,eax
  110.     mov    eax,[esi].ang1
  111.     call    sin            ; eax = sin(eax)*10000H
  112.     imul    dword ptr [esi].md1
  113.     mov    [esi].buf1,eax
  114.     mov    eax,[esi].ang2
  115.     call    sin            ; eax = sin(eax)*10000H
  116.     imul    dword ptr [esi].md2
  117.     add    eax,[esi].buf1
  118.     cdq
  119.     add    [esi].point1+2,eax
  120.     adc    word ptr [esi].point2+2,dx
  121.  
  122.     mov    eax,[esi].point2    ; source start~end check
  123.     cmp    eax,[esi].sourceEnd
  124.     jae    main021
  125.     cmp    eax,[esi].sourceStart
  126.     jae    main03
  127. main021:
  128.     xor    eax,eax
  129.     jmp    main04
  130. main03:
  131.     lea    eax,[esi].point1    ; over sampling
  132.     call    smp
  133. main04:
  134.     imul    eax,[esi].mix2        ; mix
  135.     mov    [esi].buf1,eax
  136.  
  137.     mov    eax,edi                ; source start~end check
  138.     add    eax,[esi].dly
  139.     cmp    eax,[esi].sourceEnd
  140.     jae    main041
  141.     cmp    eax,[esi].sourceStart
  142.     jae    main05
  143. main041:
  144.     xor    eax,eax
  145.     jmp    main06
  146. main05:
  147.     mov    edx,[esi].dly
  148.     mov    al,[edi][edx]
  149.     and    eax,0ffH
  150.     cmp    eax,128
  151.     jb    main06
  152.     mov    edx,eax
  153.     mov    eax,128
  154.     sub    eax,edx
  155. main06:
  156.     imul    eax,[esi].mix1
  157.     add    eax,[esi].buf1
  158.     sar    eax,8
  159.     js    main07            ; eax --> pcm data
  160.     je    main07
  161.     cmp    eax,128            ; +
  162.     jb    main08
  163.     mov    eax,127
  164.     jmp    main08
  165. main07:
  166.     mov    edx,eax            ; -
  167.     mov    eax,128
  168.     sub    eax,edx
  169.     cmp    eax,256-1    ; data255はloopStopの意味があるから除外 1993 12
  170.     jb    main08
  171.     mov    eax,255-1    ; data255はloopStopの意味があるから除外 1993 12
  172. main08:
  173.     mov    [ebx],al
  174.  
  175.     mov    eax,[esi].sp1
  176.     add    [esi].ang1,eax
  177.     mov    eax,[esi].sp2
  178.     add    [esi].ang2,eax
  179.     inc    edi
  180.     inc    ebx
  181.     dec    ecx
  182.     jne    main02
  183.  
  184. mainE:
  185.     pop    ebx
  186.     pop    edi
  187.     pop    esi
  188.     mov    esp,ebp
  189.     pop    ebp
  190.     ret
  191.  
  192. ;    OVER SAMPLING for PCM DATA(8bit)
  193. ;input    eax = 64bit(32bit/decimal,32bit/integer) data address(ds:)
  194. ;output    eax = over sampring data ( 32bit sign (-128 -- +127) )
  195.  
  196. smp:    push    ebx
  197.     push    ecx
  198.     push    edx
  199.     push    esi
  200.     push    edi
  201.     mov    ebx,[eax]        ; ebx = decimal
  202.     mov    esi,[eax+4]        ; esi = integer
  203.     shr    ebx,24            ; ebx --> 8bit
  204.     jne    smp00
  205.  
  206.     mov    al,[esi]        ; decimal=0
  207.     and    eax,0ffH
  208.     cmp    eax,128
  209.     jb    smp0A
  210.     mov    edx,eax
  211.     mov    eax,128
  212.     sub    eax,edx
  213. smp0A:    jmp    smp06
  214.  
  215. smp00:
  216.     mov    eax,[esi-1]        ; 周囲がみな無信号ならノイズを出さないよう直接0を返す
  217.     cmp    eax,80808080h
  218.     jne    smp0B
  219.     xor    eax,eax
  220.     jmp    smp06
  221.  
  222. smp0B:
  223.     call    smp01
  224. smp01:    pop    edi
  225.     add    edi,smptb-smp01        ; edi = table point
  226.  
  227.     mov    al,[esi]
  228.     and    eax,0ffH
  229.     cmp    eax,128
  230.     jb    smp02
  231.     mov    edx,eax
  232.     mov    eax,128
  233.     sub    eax,edx
  234. smp02:    add    eax,128
  235.     mul    byte ptr cs:[edi][ebx]
  236.     mov    ecx,eax
  237.  
  238.     mov    al,[esi-1]
  239.     and    eax,0ffH
  240.     cmp    eax,128
  241.     jb    smp03
  242.     mov    edx,eax
  243.     mov    eax,128
  244.     sub    eax,edx
  245. smp03:    add    eax,128
  246.     mul    byte ptr cs:[edi][ebx+256]
  247.     sub    ecx,eax
  248.  
  249.     mov    eax,ebx            ; ebx = 256 - ebx
  250.     mov    ebx,256
  251.     sub    ebx,eax
  252.  
  253.     mov    al,[esi+1]
  254.     and    eax,0ffH
  255.     cmp    eax,128
  256.     jb    smp04
  257.     mov    edx,eax
  258.     mov    eax,128
  259.     sub    eax,edx
  260. smp04:    add    eax,128
  261.     mul    byte ptr cs:[edi][ebx]
  262.     add    ecx,eax
  263.  
  264.     mov    al,[esi+2]
  265.     and    eax,0ffH
  266.     cmp    eax,128
  267.     jb    smp05
  268.     mov    edx,eax
  269.     mov    eax,128
  270.     sub    eax,edx
  271. smp05:    add    eax,128
  272.     mul    byte ptr cs:[edi][ebx+256]
  273.     sub    ecx,eax
  274.     sub    ecx,128*256
  275.     sar    ecx,8
  276.     mov    eax,ecx
  277.  
  278. smp06:    pop    edi
  279.     pop    esi
  280.     pop    edx
  281.     pop    ecx
  282.     pop    ebx
  283.     ret    
  284.  
  285. smptb    db    255,255,255,254,254,253,253,252
  286.     db    252,251,251,250,249,249,248,248
  287.     db    247,246,246,245,244,244,243,243
  288.     db    242,241,240,240,239,238,238,237
  289.     db    236,236,235,234,233,233,232,231
  290.     db    230,229,229,228,227,226,225,225
  291.     db    224,223,222,221,221,220,219,218
  292.     db    217,216,215,214,214,213,212,211
  293.     db    210,209,208,207,206,205,204,204
  294.     db    203,202,201,200,199,198,197,196
  295.     db    195,194,193,192,191,190,189,188
  296.     db    187,186,185,184,183,182,181,180
  297.     db    179,178,177,176,175,174,172,171
  298.     db    170,169,168,167,166,165,164,163
  299.     db    162,161,160,158,157,156,155,154
  300.     db    153,152,151,150,148,147,146,145
  301.     db    144,143,142,141,139,138,137,136
  302.     db    135,134,133,132,130,129,128,127
  303.     db    126,125,123,122,121,120,119,118
  304.     db    117,115,114,113,112,111,110,108
  305.     db    107,106,105,104,103,101,100,099
  306.     db    098,097,096,094,093,092,091,090
  307.     db    089,087,086,085,084,083,082,080
  308.     db    079,078,077,076,075,073,072,071
  309.     db    070,069,068,067,065,064,063,062
  310.     db    061,060,058,057,056,055,054,053
  311.     db    052,051,049,048,047,046,045,044
  312.     db    043,042,040,039,038,037,036,035
  313.     db    034,033,032,030,029,028,027,026
  314.     db    025,024,023,022,021,020,019,018
  315.     db    016,015,014,013,012,011,010,009
  316.     db    008,007,006,005,004,003,002,001
  317.  
  318.     db    000,000,001,001,001,002,002,002
  319.     db    003,003,003,003,004,004,004,005
  320.     db    005,005,005,006,006,006,006,007
  321.     db    007,007,007,008,008,008,008,009
  322.     db    009,009,009,009,010,010,010,010
  323.     db    010,011,011,011,011,011,011,012
  324.     db    012,012,012,012,012,013,013,013
  325.     db    013,013,013,013,014,014,014,014
  326.     db    014,014,014,014,014,015,015,015
  327.     db    015,015,015,015,015,015,015,015
  328.     db    015,016,016,016,016,016,016,016
  329.     db    016,016,016,016,016,016,016,016
  330.     db    016,016,016,016,016,016,016,016
  331.     db    016,016,016,016,016,016,016,016
  332.     db    016,016,016,016,016,016,016,016
  333.     db    016,016,016,016,016,016,016,016
  334.     db    016,016,016,016,016,016,016,016
  335.     db    016,016,015,015,015,015,015,015
  336.     db    015,015,015,015,015,015,015,015
  337.     db    014,014,014,014,014,014,014,014
  338.     db    014,014,014,013,013,013,013,013
  339.     db    013,013,013,013,012,012,012,012
  340.     db    012,012,012,012,012,011,011,011
  341.     db    011,011,011,011,011,010,010,010
  342.     db    010,010,010,010,009,009,009,009
  343.     db    009,009,009,008,008,008,008,008
  344.     db    008,008,007,007,007,007,007,007
  345.     db    007,006,006,006,006,006,006,005
  346.     db    005,005,005,005,005,004,004,004
  347.     db    004,004,004,003,003,003,003,003
  348.     db    003,002,002,002,002,002,002,001
  349.     db    001,001,001,001,001,000,000,000
  350.  
  351.  
  352.  
  353. sin:    push    ebx
  354.     push    ecx
  355.     push    edx
  356.     mov    edx,eax
  357.     and    edx,30000H
  358.     cmp    edx,10000H
  359.     je    sin01
  360.     cmp    edx,30000H
  361.     je    sin01
  362.     jmp    sin02
  363. sin01:    mov    bx,ax
  364.     mov    ax,0ffffH
  365.     sub    ax,bx
  366. sin02:    and    eax,0ffffH
  367.     call    sin03
  368. sin03:    pop    ecx
  369.     add    ecx,sintb-sin03
  370.     push    eax
  371.     shr    eax,8
  372.     mov    bx,cs:[ecx][eax*2]
  373.     mov    cx,cs:[ecx+2][eax*2]
  374.     and    ebx,0ffffH
  375.     and    ecx,0ffffH
  376.     sub    ecx,ebx
  377.     pop    eax
  378.     and    eax,0ffH
  379.     imul    eax,ecx
  380.     shr    eax,8
  381.     add    eax,ebx
  382.     cmp    edx,20000H
  383.     jb    sin04
  384.     mov    ebx,eax
  385.     xor    eax,eax
  386.     sub    eax,ebx
  387. sin04:    pop    edx
  388.     pop    ecx
  389.     pop    ebx
  390.     ret
  391.  
  392. sintb    dw    00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
  393.     dw    00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
  394.     dw    01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
  395.     dw    0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
  396.     dw    031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
  397.     dw    03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
  398.     dw    04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
  399.     dw    0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
  400.     dw    061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
  401.     dw    06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
  402.     dw    078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
  403.     dw    0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
  404.     dw    08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
  405.     dw    0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
  406.     dw    0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
  407.     dw    0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
  408.     dw    0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
  409.     dw    0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
  410.     dw    0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
  411.     dw    0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
  412.     dw    0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
  413.     dw    0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
  414.     dw    0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
  415.     dw    0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
  416.     dw    0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
  417.     dw    0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
  418.     dw    0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
  419.     dw    0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
  420.     dw    0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
  421.     dw    0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
  422.     dw    0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
  423.     dw    0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
  424.     dw    0FFFFH
  425.  
  426. sndPhaseDelay    endp
  427.  
  428. cseg    ends
  429.     end
  430.